SharedArrayBufferãšAtomicsãå©çšããŠãå ç¢ã§é«æ§èœãªJavaScript䞊è¡ãã©ã€æšãæ§ç¯ããæ¹æ³ã解説ãã°ããŒãã«ãªãã«ãã¹ã¬ããç°å¢ã§ã®ã¹ã¬ããã»ãŒããªããŒã¿ç®¡çãšãäžè¬çãªäžŠè¡åŠçã®èª²é¡å ææ³ãåŠã³ãŸãã
䞊è¡åŠçããã¹ã¿ãŒããïŒã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³åãJavaScriptã¹ã¬ããã»ãŒãã»ãã©ã€æšã®æ§ç¯
仿¥ã®çžäºæ¥ç¶ãããäžçã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«ã¯é床ã ãã§ãªããå¿çæ§ãå€§èŠæš¡ãªåææäœãåŠçããèœåãæ±ããããŸããäŒçµ±çã«ãã©ãŠã¶ã§ã®ã·ã³ã°ã«ã¹ã¬ããæ§ã§ç¥ãããŠããJavaScriptã¯ãå€§å¹ ãªé²åãéããçã®äžŠååŠçã«åãçµãããã®åŒ·åãªããªããã£ããæäŸããŠããŸããç¹ã«å€§èŠæš¡ã§åçãªããŒã¿ã»ããããã«ãã¹ã¬ããã³ã³ããã¹ãã§æ±ãéã«ããã°ãã°äžŠè¡åŠçã®èª²é¡ã«çŽé¢ããäžè¬çãªããŒã¿æ§é ã®äžã€ãããã©ã€æšïŒTrieïŒãå¥åãã¬ãã£ãã¯ã¹æšã§ãã
äœçŸäžäººãã®ãŠãŒã¶ãŒãããã€ã¹ãçµ¶ããããŒã¿ã®ã¯ãšãªãæŽæ°ãè¡ã£ãŠãããã°ããŒãã«ãªãªãŒãã³ã³ããªãŒããµãŒãã¹ããªã¢ã«ã¿ã€ã èŸæžããŸãã¯åçãªIPã«ãŒãã£ã³ã°ããŒãã«ãæ§ç¯ããããšãæ³åããŠã¿ãŠãã ãããæšæºçãªãã©ã€æšã¯ããã¬ãã£ãã¯ã¹ããŒã¹ã®æ€çŽ¢ã«ã¯éåžžã«å¹ççã§ããã䞊è¡ç°å¢ã§ã¯ããã«ããã«ããã¯ãšãªããç«¶åç¶æ
ãããŒã¿ç Žæã®åœ±é¿ãåãããããªããŸãããã®å
æ¬çãªã¬ã€ãã§ã¯ãJavaScript䞊è¡ãã©ã€æšãæ§ç¯ããæ¹æ³ãæãäžããSharedArrayBufferãšAtomicsãé©åã«äœ¿çšããããšã§ã¹ã¬ããã»ãŒãã«ããã°ããŒãã«ãªå©çšè
ã«åããå
ç¢ã§ã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ãå¯èœã«ããŸãã
ãã©ã€æšãçè§£ããïŒãã¬ãã£ãã¯ã¹ããŒã¹ããŒã¿ã®åºç€
䞊è¡åŠçã®è€éãã«é£ã³èŸŒãåã«ããã©ã€æšãšã¯äœãããããŠãªããããéåžžã«äŸ¡å€ãããã®ãã«ã€ããŠã確ããªçè§£ã確ç«ããŸãããã
ãã©ã€æšãšã¯ïŒ
ãã©ã€æšïŒTrieïŒã¯ããretrievalããšããåèªã«ç±æ¥ãïŒãããªãŒããŸãã¯ããã©ã€ããšçºé³ïŒãããŒãéåžžã¯æååã§ããåçãªã»ããã飿³é åãæ ŒçŽããããã«äœ¿çšãããé åºä»ãæšããŒã¿æ§é ã§ããããŒããå®éã®ããŒãæ ŒçŽããäºåæ¢çŽ¢æšãšã¯ç°ãªãããã©ã€æšã®ããŒãã¯ããŒã®äžéšãæ ŒçŽããæšã®äžã§ã®ããŒãã®äœçœ®ãããã«é¢é£ä»ããããããŒãå®çŸ©ããŸãã
- ããŒããšãšããžïŒ åããŒãã¯éåžž1æåã衚ããã«ãŒãããç¹å®ã®ããŒããŸã§ã®ãã¹ããã¬ãã£ãã¯ã¹ã圢æããŸãã
- åããŒãïŒ åããŒãã¯åããŒããžã®åç §ãæã¡ãéåžžã¯é åããããã§ç®¡çãããã€ã³ããã¯ã¹/ããŒãã·ãŒã±ã³ã¹å ã®æ¬¡ã®æåã«å¯Ÿå¿ããŸãã
- çµç«¯ãã©ã°ïŒ ããŒãã¯ããã®ããŒãã«è³ããã¹ãå®å šãªåèªã衚ãããšã瀺ããçµç«¯ããŸãã¯ãisWordããã©ã°ãæã€ããšãã§ããŸãã
ãã®æ§é ã«ãããéåžžã«å¹ççãªãã¬ãã£ãã¯ã¹ããŒã¹ã®æäœãå¯èœã«ãªããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ããã·ã¥ããŒãã«ãäºåæ¢çŽ¢æšãããåªããŠããŸãã
ãã©ã€æšã®äžè¬çãªãŠãŒã¹ã±ãŒã¹
ãã©ã€æšãæååããŒã¿ãæ±ãéã®å¹çæ§ã¯ãæ§ã ãªã¢ããªã±ãŒã·ã§ã³ã«ãããŠäžå¯æ¬ ãªãã®ãšãªã£ãŠããŸãã
-
ãªãŒãã³ã³ããªãŒããšå
è¡å
¥ååè£ïŒ ããããæãæåãªã¢ããªã±ãŒã·ã§ã³ã§ããGoogleã®ãããªæ€çŽ¢ãšã³ãžã³ãã³ãŒããšãã£ã¿ïŒIDEïŒããŸãã¯å
¥åäžã«åè£ãæäŸããã¡ãã»ãŒãžã³ã°ã¢ããªãèããŠã¿ãŠãã ããããã©ã€æšã¯ãäžãããããã¬ãã£ãã¯ã¹ã§å§ãŸããã¹ãŠã®åèªãè¿
éã«èŠã€ããããšãã§ããŸãã
- ã°ããŒãã«ãªäŸïŒ åœéçãªEã³ããŒã¹ãã©ãããã©ãŒã åãã«ãäœåãã®èšèªã§ãªã¢ã«ã¿ã€ã ã«ããŒã«ã©ã€ãºããããªãŒãã³ã³ããªãŒãåè£ãæäŸããã
-
ã¹ãã«ãã§ãã«ãŒïŒ æ£ããç¶Žãããåèªã®èŸæžãæ ŒçŽããããšã§ããã©ã€æšã¯åèªãååšãããã©ãããå¹ççã«ãã§ãã¯ãããããã¬ãã£ãã¯ã¹ã«åºã¥ããŠä»£æ¿æ¡ãææ¡ãããã§ããŸãã
- ã°ããŒãã«ãªäŸïŒ ã°ããŒãã«ãªã³ã³ãã³ãäœæããŒã«ã§ã倿§ãªèšèªã®å ¥åã«å¯ŸããŠæ£ããã¹ãã«ãä¿èšŒããã
-
IPã«ãŒãã£ã³ã°ããŒãã«ïŒ ãã©ã€æšã¯æé·ãã¬ãã£ãã¯ã¹äžèŽã«åªããŠãããããã¯IPã¢ãã¬ã¹ã«æãå
·äœçãªã«ãŒããæ±ºå®ããããã®ãããã¯ãŒã¯ã«ãŒãã£ã³ã°ã®åºæ¬ã§ãã
- ã°ããŒãã«ãªäŸïŒ åºå€§ãªåœéãããã¯ãŒã¯ãä»ããããŒã¿ãã±ããã«ãŒãã£ã³ã°ãæé©åããã
-
èŸæžæ€çŽ¢ïŒ åèªãšãã®å®çŸ©ã®é«éãªæ€çŽ¢ã
- ã°ããŒãã«ãªäŸïŒ äœåäžãã®åèªã«ãããè¿ éãªæ€çŽ¢ããµããŒãããå€èšèªèŸæžãæ§ç¯ããã
-
ãã€ãªã€ã³ãã©ããã£ã¯ã¹ïŒ é·ãæååãäžè¬çãªDNAããã³RNAã·ãŒã±ã³ã¹ã®ãã¿ãŒã³ãããã³ã°ã«äœ¿çšãããŸãã
- ã°ããŒãã«ãªäŸïŒ äžçäžã®ç ç©¶æ©é¢ããæäŸãããã²ãã ããŒã¿ãåæããã
JavaScriptã«ããã䞊è¡åŠçã®èª²é¡
JavaScriptãã·ã³ã°ã«ã¹ã¬ããã§ãããšããè©å€ã¯ãç¹ã«Webãã©ãŠã¶ã«ãããã¡ã€ã³å®è¡ç°å¢ã«ãããŠã¯å€§éšåãçå®ã§ããããããçŸä»£ã®JavaScriptã¯äžŠååŠçãå®çŸããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŠãããããã«äŒŽãã䞊è¡ããã°ã©ãã³ã°ã®å€å žçãªèª²é¡ãçããŠããŸãã
JavaScriptã®ã·ã³ã°ã«ã¹ã¬ããæ§ïŒãšãã®éçïŒ
ã¡ã€ã³ã¹ã¬ããäžã®JavaScriptãšã³ãžã³ã¯ãã€ãã³ãã«ãŒããä»ããŠã¿ã¹ã¯ãé æ¬¡åŠçããŸãããã®ã¢ãã«ã¯ããããããã¯ã®ãããªäžè¬çãªäžŠè¡åŠçã®åé¡ãé²ããWebéçºã®å€ãã®åŽé¢ãç°¡çŽ åããŸããããããèšç®éã®å€ãã¿ã¹ã¯ã«å¯ŸããŠã¯ãUIã®ç¡å¿çããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äœäžã«ã€ãªããå¯èœæ§ããããŸãã
Web Workersã®å°é ïŒãã©ãŠã¶ã§ã®çã®äžŠè¡åŠç
Web Workersã¯ãWebããŒãžã®ã¡ã€ã³å®è¡ã¹ã¬ãããšã¯å¥ã®ããã¯ã°ã©ãŠã³ãã¹ã¬ããã§ã¹ã¯ãªãããå®è¡ããæ¹æ³ãæäŸããŸããããã«ãããæéã®ããããCPUããŠã³ããªã¿ã¹ã¯ããªãããŒãããUIã®å¿çæ§ãç¶æã§ããŸããããŒã¿ã¯éåžžãã¡ã€ã³ã¹ã¬ãããšã¯ãŒã«ãŒéããŸãã¯ã¯ãŒã«ãŒå士ã§ã¡ãã»ãŒãžããã·ã³ã°ã¢ãã«ïŒpostMessage()ïŒã䜿çšããŠå
±æãããŸãã
-
ã¡ãã»ãŒãžããã·ã³ã°ïŒ ããŒã¿ã¯ã¹ã¬ããéã§éä¿¡ãããéã«ãæ§é åã¯ããŒã³ãïŒã³ããŒïŒãããŸããå°ããªã¡ãã»ãŒãžã®å Žåã¯å¹ççã§ãããäœçŸäžãã®ããŒããå«ãå¯èœæ§ã®ãããã©ã€æšã®ãããªå€§ããªããŒã¿æ§é ã®å Žåãæ§é å
šäœãç¹°ãè¿ãã³ããŒããããšã¯æ³å€ãªã³ã¹ããšãªãã䞊è¡åŠçã®å©ç¹ãæã¡æ¶ããŠããŸããŸãã
- èå¯ïŒ ãã©ã€æšãäž»èŠãªèšèªã®èŸæžããŒã¿ãä¿æããŠããå Žåãã¯ãŒã«ãŒã®ã€ã³ã¿ã©ã¯ã·ã§ã³ããšã«ãããã³ããŒããã®ã¯éå¹çã§ãã
åé¡ç¹ïŒå¯å€ãªå ±æç¶æ ãšç«¶åç¶æ
è€æ°ã®ã¹ã¬ããïŒWeb WorkersïŒãåãããŒã¿æ§é ã«ã¢ã¯ã»ã¹ããŠå€æŽããå¿ èŠãããããã®ããŒã¿æ§é ãå¯å€ã§ããå Žåãç«¶åç¶æ ãæ·±å»ãªæžå¿µãšãªããŸãããã©ã€æšã¯ãã®æ§è³ªäžãå¯å€ã§ããåèªãæ¿å ¥ãæ€çŽ¢ããããŠæã«ã¯åé€ãããŸããé©åãªåæããªããã°ãåææäœã¯æ¬¡ã®ãããªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
- ããŒã¿ç ŽæïŒ 2ã€ã®ã¯ãŒã«ãŒãåæã«åãæåã®æ°ããããŒããæ¿å ¥ããããšãããšãäºãã®å€æŽãäžæžãããäžå®å šãŸãã¯äžæ£ç¢ºãªãã©ã€æšã«ã€ãªããå¯èœæ§ããããŸãã
- äžæŽåãªèªã¿åãïŒ ã¯ãŒã«ãŒãéšåçã«æŽæ°ããããã©ã€æšãèªã¿åããäžæ£ç¢ºãªæ€çŽ¢çµæã«ã€ãªããå¯èœæ§ããããŸãã
- æŽæ°ã®åªå€±ïŒ ããã¯ãŒã«ãŒã®å€æŽããå¥ã®ã¯ãŒã«ãŒãæåã®å€æŽãèªèããã«äžæžãããå Žåãå®å šã«å€±ãããå¯èœæ§ããããŸãã
ããããæšæºçãªãªããžã§ã¯ãããŒã¹ã®JavaScriptãã©ã€æšããã·ã³ã°ã«ã¹ã¬ããã³ã³ããã¹ãã§ã¯æ©èœãããã®ã®ãWeb Workerséã§çŽæ¥å ±æããŠå€æŽããã«ã¯å šãé©ããŠããªãçç±ã§ãã解決çã¯ãæç€ºçãªã¡ã¢ãªç®¡çãšã¢ãããã¯æäœã«ãããŸãã
ã¹ã¬ããã»ãŒãã®å®çŸïŒJavaScriptã®äžŠè¡åŠçããªããã£ã
ã¡ãã»ãŒãžããã·ã³ã°ã®å¶éãå
æããçã®ã¹ã¬ããã»ãŒããªå
±æç¶æ
ãå¯èœã«ããããã«ãJavaScriptã¯åŒ·åãªäœã¬ãã«ããªããã£ããå°å
¥ããŸããïŒSharedArrayBufferãšAtomicsã§ãã
SharedArrayBufferã®å°å
¥
SharedArrayBufferã¯ãArrayBufferã«äŒŒãåºå®é·ã®çã®ãã€ããªããŒã¿ãããã¡ã§ããããã®å
容ãè€æ°ã®Web Workerséã§å
±æã§ãããšããæ±ºå®çãªéãããããŸããããŒã¿ãã³ããŒãã代ããã«ãã¯ãŒã«ãŒã¯åãåºç€ãšãªãã¡ã¢ãªã«çŽæ¥ã¢ã¯ã»ã¹ããŠå€æŽã§ããŸããããã«ãããå€§èŠæš¡ã§è€éãªããŒã¿æ§é ã®ããŒã¿è»¢éãªãŒããŒãããããªããªããŸãã
- å
±æã¡ã¢ãªïŒ
SharedArrayBufferã¯ãæå®ããããã¹ãŠã®Web Workersãèªã¿æžãã§ããå®éã®ã¡ã¢ãªé åã§ãã - ã¯ããŒã³ãªãïŒ
SharedArrayBufferãWeb Workerã«æž¡ããšãã³ããŒã§ã¯ãªããåãã¡ã¢ãªç©ºéãžã®åç §ãæž¡ãããŸãã - ã»ãã¥ãªãã£ã«é¢ããèæ
®äºé
ïŒ Spectreã®ãããªæ»æã®å¯èœæ§ãããããã
SharedArrayBufferã«ã¯ç¹å®ã®ã»ãã¥ãªãã£èŠä»¶ããããŸããWebãã©ãŠã¶ã®å ŽåãéåžžãCross-Origin-Opener-Policy (COOP)ãšCross-Origin-Embedder-Policy (COEP)ã®HTTPããããŒãsame-originãŸãã¯credentiallessã«èšå®ããå¿ èŠããããŸããããã¯ããµãŒããŒèšå®ãæŽæ°ããå¿ èŠããããããã°ããŒãã«ãªå±éã«ãšã£ãŠéèŠãªãã€ã³ãã§ããNode.jsç°å¢ïŒworker_threadsã䜿çšïŒã«ã¯ããããã®ãã©ãŠã¶åºæã®å¶éã¯ãããŸããã
ããããSharedArrayBufferã ãã§ã¯ç«¶åç¶æ
ã®åé¡ã¯è§£æ±ºããŸãããå
±æã¡ã¢ãªã¯æäŸããŸãããåæã¡ã«ããºã ã¯æäŸããŸããã
Atomicsã®å
Atomicsã¯ãå
±æã¡ã¢ãªã«å¯Ÿããã¢ãããã¯æäœãæäŸããã°ããŒãã«ãªããžã§ã¯ãã§ãããã¢ãããã¯ããšã¯ãæäœãä»ã®ã©ã®ã¹ã¬ããã«ãäžæãããããšãªãå®å
šã«å®äºããããšãä¿èšŒãããããšãæå³ããŸããããã«ãããè€æ°ã®ã¯ãŒã«ãŒãSharedArrayBufferå
ã®åãã¡ã¢ãªãã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããéã®ããŒã¿æŽåæ§ã確ä¿ãããŸãã
䞊è¡ãã©ã€æšã®æ§ç¯ã«äžå¯æ¬ ãªäž»èŠãªAtomicsã¡ãœããã«ã¯ã次ã®ãã®ããããŸãã
-
Atomics.load(typedArray, index)ïŒSharedArrayBufferã«è£æã¡ãããTypedArrayã®æå®ãããã€ã³ããã¯ã¹ã®å€ãã¢ãããã¯ã«èªã¿èŸŒã¿ãŸãã- äœ¿çšæ³ïŒ ããŒãã®ããããã£ïŒåãã€ã³ã¿ãæåã³ãŒããçµç«¯ãã©ã°ãªã©ïŒãå¹²æžãªãã«èªã¿åãããã
-
Atomics.store(typedArray, index, value)ïŒ æå®ãããã€ã³ããã¯ã¹ã«å€ãã¢ãããã¯ã«æ ŒçŽããŸãã- äœ¿çšæ³ïŒ æ°ããããŒãã®ããããã£ãæžã蟌ãããã
-
Atomics.add(typedArray, index, value)ïŒ æå®ãããã€ã³ããã¯ã¹ã®æ¢åã®å€ã«å€ãã¢ãããã¯ã«è¿œå ããå€ãå€ãè¿ããŸããã«ãŠã³ã¿ãŒïŒåç §ã«ãŠã³ãããæ¬¡ã«å©çšå¯èœãªã¡ã¢ãªã¢ãã¬ã¹ããã€ã³ã¿ã®ã€ã³ã¯ãªã¡ã³ããªã©ïŒã«åœ¹ç«ã¡ãŸãã -
Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)ïŒ ããã¯ã䞊è¡ããŒã¿æ§é ã«ãšã£ãŠããããæã匷åãªã¢ãããã¯æäœã§ããindexã®å€ãexpectedValueãšäžèŽãããã©ãããã¢ãããã¯ã«ãã§ãã¯ããŸããäžèŽããå Žåãå€ãreplacementValueã«çœ®ãæããŠå€ãå€ïŒexpectedValueïŒãè¿ããŸããäžèŽããªãå Žåã倿Žã¯è¡ããããindexã®å®éã®å€ãè¿ããŸãã- äœ¿çšæ³ïŒ ããã¯ïŒã¹ãã³ããã¯ããã¥ãŒããã¯ã¹ïŒã®å®è£ ãæ¥œèгçäžŠè¡æ§ããŸãã¯ç¶æ ãæåŸ éãã§ããå Žåã«ã®ã¿å€æŽãè¡ãããããšãä¿èšŒãããããããã¯ãæ°ããããŒããäœæãããããã€ã³ã¿ãå®å šã«æŽæ°ãããããããã«äžå¯æ¬ ã§ãã
-
Atomics.wait(typedArray, index, value, [timeout])ãšAtomics.notify(typedArray, index, [count])ïŒ ãããã¯ããé«åºŠãªåæãã¿ãŒã³ã«äœ¿çšãããã¯ãŒã«ãŒãç¹å®ã®æ¡ä»¶ããããã¯ããŠåŸ æ©ããããã倿Žããããšãã«éç¥ãããããã«ããŸãããããã¥ãŒãµãŒã»ã³ã³ã·ã¥ãŒããŒãã¿ãŒã³ãè€éãªãããã³ã°ã¡ã«ããºã ã«åœ¹ç«ã¡ãŸãã
å
±æã¡ã¢ãªã®ããã®SharedArrayBufferãšåæã®ããã®Atomicsã®çžä¹å¹æã«ãããJavaScriptã§äžŠè¡ãã©ã€æšã®ãããªè€éã§ã¹ã¬ããã»ãŒããªããŒã¿æ§é ãæ§ç¯ããããã«å¿
èŠãªåºç€ãæäŸãããŸãã
SharedArrayBufferãšAtomicsã«ãã䞊è¡ãã©ã€æšã®èšèš
䞊è¡ãã©ã€æšã®æ§ç¯ã¯ããªããžã§ã¯ãæåã®ãã©ã€æšãåã«å ±æã¡ã¢ãªæ§é ã«å€æããããšã§ã¯ãããŸãããããŒãã®è¡šçŸæ¹æ³ãæäœã®åææ¹æ³ã«æ ¹æ¬çãªè»¢æãå¿ èŠã§ãã
ã¢ãŒããã¯ãã£ã«é¢ããèæ ®äºé
SharedArrayBufferå
ã§ã®ãã©ã€æ§é ã®è¡šçŸ
çŽæ¥çãªåç
§ãæã€JavaScriptãªããžã§ã¯ãã®ä»£ããã«ããã©ã€æšã®ããŒãã¯SharedArrayBufferå
ã®é£ç¶ããã¡ã¢ãªãããã¯ãšããŠè¡šçŸãããªããã°ãªããŸãããããã¯æ¬¡ã®ããšãæå³ããŸãã
- ç·åœ¢ã¡ã¢ãªå²ãåœãŠïŒ éåžžãåäžã®
SharedArrayBufferã䜿çšãããããåºå®ãµã€ãºã®ãã¹ãããããŸãã¯ãããŒãžãã®å€§ããªé åãšèŠãªããŸããåã¹ãããããã©ã€æšããŒãã衚ããŸãã - ã€ã³ããã¯ã¹ãšããŠã®ããŒããã€ã³ã¿ïŒ ä»ã®ãªããžã§ã¯ããžã®åç
§ãæ ŒçŽãã代ããã«ãåãã€ã³ã¿ã¯åã
SharedArrayBufferå ã®å¥ã®ããŒãã®éå§äœçœ®ãæãæ°å€ã€ã³ããã¯ã¹ã«ãªããŸãã - åºå®ãµã€ãºã®ããŒãïŒ ã¡ã¢ãªç®¡çãç°¡çŽ åããããã«ãåãã©ã€æšããŒãã¯äºåã«å®çŸ©ããããã€ãæ°ãå æããŸãããã®åºå®ãµã€ãºã«ã¯ããã®æåãåãã€ã³ã¿ãããã³çµç«¯ãã©ã°ãå容ãããŸãã
SharedArrayBufferå
ã®ç°¡ç¥åãããããŒãæ§é ãèããŠã¿ãŸããããåããŒãã¯æŽæ°ã®é
åïŒäŸïŒSharedArrayBufferäžã®Int32ArrayãŸãã¯Uint32Arrayãã¥ãŒïŒã§ããã以äžã®ããã«ãªããŸãã
- ã€ã³ããã¯ã¹ 0ïŒ`characterCode`ïŒãã®ããŒãã衚ãæåã®ASCII/Unicodeå€ãã«ãŒãã®å Žåã¯0ïŒã
- ã€ã³ããã¯ã¹ 1ïŒ`isTerminal`ïŒfalseã®å Žåã¯0ãtrueã®å Žåã¯1ïŒã
- ã€ã³ããã¯ã¹ 2ããNïŒ`children[0...25]`ïŒãŸãã¯ããåºãæåã»ããã®å Žåã¯ãã以äžïŒãåå€ã¯
SharedArrayBufferå ã®åããŒããžã®ã€ã³ããã¯ã¹ã§ããããã®æåã«å¯Ÿå¿ããåãååšããªãå Žåã¯0ã§ãã - æ°ããããŒããå²ãåœãŠãããã®`nextFreeNodeIndex`ãã€ã³ã¿ããããã¡å ã®ã©ããïŒãŸãã¯å€éšã§ç®¡çïŒã«ãããŸãã
äŸïŒããŒãã30åã®`Int32`ã¹ããããå æããSharedArrayBufferã`Int32Array`ãšããŠèŠãªãããå Žåãã€ã³ããã¯ã¹`i`ã®ããŒãã¯`i * 30`ããå§ãŸããŸãã
空ãã¡ã¢ãªãããã¯ã®ç®¡ç
æ°ããããŒããæ¿å
¥ããããšããã¹ããŒã¹ãå²ãåœãŠãå¿
èŠããããŸããç°¡åãªã¢ãããŒãã¯ãSharedArrayBufferå
ã®æ¬¡ã«å©çšå¯èœãªç©ºãã¹ããããžã®ãã€ã³ã¿ãç¶æããããšã§ãããã®ãã€ã³ã¿èªäœãã¢ãããã¯ã«æŽæ°ããå¿
èŠããããŸãã
ã¹ã¬ããã»ãŒããªæ¿å ¥ã®å®è£ ïŒ`insert`æäœïŒ
æ¿å
¥ã¯ããã©ã€æ§é ã倿Žããæœåšçã«æ°ããããŒããäœæãããã€ã³ã¿ãæŽæ°ãããããæãè€éãªæäœã§ããããã§ãäžè²«æ§ã確ä¿ããããã«Atomics.compareExchange()ãäžå¯æ¬ ã«ãªããŸãã
ãappleãã®ãããªåèªãæ¿å ¥ããæé ã®æŠèŠã以äžã«ç€ºããŸãã
ã¹ã¬ããã»ãŒããªæ¿å ¥ã®æŠå¿µçãªæé ïŒ
- ã«ãŒãããéå§ïŒ ã«ãŒãããŒãïŒã€ã³ããã¯ã¹0ïŒãããã©ããŒã¹ãéå§ããŸããã«ãŒãã¯éåžžãæåèªäœã衚ããŸããã
-
æåããšã«ãã©ããŒã¹ïŒ åèªã®åæåïŒäŸïŒãaãããpãããpãããlãããeãïŒã«ã€ããŠïŒ
- åã€ã³ããã¯ã¹ã®æ±ºå®ïŒ çŸåšã®ããŒãã®åãã€ã³ã¿å ã§ãçŸåšã®æåã«å¯Ÿå¿ããã€ã³ããã¯ã¹ãèšç®ããŸããïŒäŸïŒ`children[char.charCodeAt(0) - 'a'.charCodeAt(0)]`ïŒã
- åãã€ã³ã¿ã®ã¢ãããã¯ãªèªã¿èŸŒã¿ïŒ `Atomics.load(typedArray, current_node_child_pointer_index)`ã䜿çšããŠãæœåšçãªåããŒãã®éå§ã€ã³ããã¯ã¹ãååŸããŸãã
-
åã®ååšç¢ºèªïŒ
-
èªã¿èŸŒãŸããåãã€ã³ã¿ã0ã®å ŽåïŒåãååšããªãïŒïŒããã§æ°ããããŒããäœæããå¿
èŠããããŸãã
- æ°ããããŒãã€ã³ããã¯ã¹ã®å²ãåœãŠïŒ æ°ããããŒãã®ããã®äžæãªã€ã³ããã¯ã¹ãã¢ãããã¯ã«ååŸããŸããããã¯éåžžããæ¬¡ã«å©çšå¯èœãªããŒããã«ãŠã³ã¿ãŒã®ã¢ãããã¯ãªã€ã³ã¯ãªã¡ã³ãã䌎ããŸãïŒäŸïŒ`newNodeIndex = Atomics.add(typedArray, NEXT_FREE_NODE_INDEX_OFFSET, NODE_SIZE)`ïŒãè¿ãããå€ã¯ã€ã³ã¯ãªã¡ã³ãåã®*å€ã*å€ã§ããããããæ°ããããŒãã®éå§ã¢ãã¬ã¹ã«ãªããŸãã
- æ°ããããŒãã®åæåïŒ `Atomics.store()`ã䜿çšããŠãæ°ããå²ãåœãŠãããããŒãã®ã¡ã¢ãªé åã«æåã³ãŒããš`isTerminal = 0`ãæžã蟌ã¿ãŸãã
- æ°ããããŒãã®ãªã³ã¯è©Šè¡ïŒ ãããã¹ã¬ããã»ãŒãã®ããã®éèŠãªã¹ãããã§ãã`Atomics.compareExchange(typedArray, current_node_child_pointer_index, 0, newNodeIndex)`ã䜿çšããŸãã
- `compareExchange`ã0ãè¿ããå ŽåïŒã€ãŸãããªã³ã¯ããããšãããšãã«åãã€ã³ã¿ã確ãã«0ã ã£ãå ŽåïŒãæ°ããããŒãã¯æ£åžžã«ãªã³ã¯ãããŸãã`current_node`ãšããŠæ°ããããŒãã«é²ã¿ãŸãã
- `compareExchange`ã0以å€ã®å€ãè¿ããå ŽåïŒã€ãŸãããã®éã«å¥ã®ã¯ãŒã«ãŒããã®æåã®ããŒããæ£åžžã«ãªã³ã¯ããå ŽåïŒãè¡çªãçºçããŸãããæ°ããäœæããããŒãã¯*ç Žæ£*ãïŒãŸãã¯ããŒã«ã管çããŠããå Žåã¯ããªãŒãªã¹ãã«æ»ãïŒã代ããã«`compareExchange`ã«ãã£ãŠè¿ãããã€ã³ããã¯ã¹ã`current_node`ãšããŠäœ¿çšããŸããäºå®äžãç«¶åã«ãè² ãããåè ãäœæããããŒãã䜿çšããŸãã
- èªã¿èŸŒãŸããåãã€ã³ã¿ã0以å€ã®å ŽåïŒåãæ¢ã«ååšããïŒïŒåã«`current_node`ãèªã¿èŸŒãŸããåã€ã³ããã¯ã¹ã«èšå®ããæ¬¡ã®æåã«é²ã¿ãŸãã
-
èªã¿èŸŒãŸããåãã€ã³ã¿ã0ã®å ŽåïŒåãååšããªãïŒïŒããã§æ°ããããŒããäœæããå¿
èŠããããŸãã
- çµç«¯ãšããŠããŒã¯ïŒ ãã¹ãŠã®æåãåŠçããããã`Atomics.store()`ã䜿çšããŠæåŸã®ããŒãã®`isTerminal`ãã©ã°ãã¢ãããã¯ã«1ã«èšå®ããŸãã
`Atomics.compareExchange()`ã䜿çšãããã®æ¥œèгçããã¯æŠç¥ã¯äžå¯æ¬ ã§ããæç€ºçãªãã¥ãŒããã¯ã¹ïŒ`Atomics.wait`/`notify`ã§æ§ç¯å¯èœïŒã䜿çšããã®ã§ã¯ãªãããã®ã¢ãããŒãã¯å€æŽã詊ã¿ãç«¶åãæ€åºãããå Žåã«ã®ã¿ããŒã«ããã¯ãŸãã¯é©å¿ãããããå€ãã®äžŠè¡ã·ããªãªã§å¹ççã§ãã
æ¿å ¥ã®ããã®èª¬æçãªïŒç°¡ç¥åãããïŒæ¬äŒŒã³ãŒãïŒ
const NODE_SIZE = 30; // äŸïŒã¡ã¿ããŒã¿çšã«2 + åçšã«28
const CHARACTER_CODE_OFFSET = 0;
const IS_TERMINAL_OFFSET = 1;
const CHILDREN_OFFSET = 2;
const NEXT_FREE_NODE_INDEX_OFFSET = 0; // ãããã¡ã®å
é ã«æ ŒçŽ
// 'sharedBuffer'ãSharedArrayBufferäžã®Int32Arrayãã¥ãŒã§ãããšä»®å®
function insertWord(word, sharedBuffer) {
let currentNodeIndex = NODE_SIZE; // ã«ãŒãããŒãã¯ããªãŒãã€ã³ã¿ã®åŸã«éå§
for (let i = 0; i < word.length; i++) {
const charCode = word.charCodeAt(i);
const childIndexInNode = charCode - 'a'.charCodeAt(0) + CHILDREN_OFFSET;
const childPointerOffset = currentNodeIndex + childIndexInNode;
let nextNodeIndex = Atomics.load(sharedBuffer, childPointerOffset);
if (nextNodeIndex === 0) {
// åãååšããªããããäœæã詊ã¿ã
const allocatedNodeIndex = Atomics.add(sharedBuffer, NEXT_FREE_NODE_INDEX_OFFSET, NODE_SIZE);
// æ°ããããŒããåæå
Atomics.store(sharedBuffer, allocatedNodeIndex + CHARACTER_CODE_OFFSET, charCode);
Atomics.store(sharedBuffer, allocatedNodeIndex + IS_TERMINAL_OFFSET, 0);
// ãã¹ãŠã®åãã€ã³ã¿ã¯ããã©ã«ãã§0
for (let k = 0; k < NODE_SIZE - CHILDREN_OFFSET; k++) {
Atomics.store(sharedBuffer, allocatedNodeIndex + CHILDREN_OFFSET + k, 0);
}
// æ°ããããŒããã¢ãããã¯ã«ãªã³ã¯ããããšè©Šã¿ã
const actualOldValue = Atomics.compareExchange(sharedBuffer, childPointerOffset, 0, allocatedNodeIndex);
if (actualOldValue === 0) {
// ããŒãã®ãªã³ã¯ã«æåãåŠçãç¶ãã
nextNodeIndex = allocatedNodeIndex;
} else {
// å¥ã®ã¯ãŒã«ãŒãããŒãããªã³ã¯ããããã¡ãã䜿çšãããå²ãåœãŠãããŒãã¯æªäœ¿çšã«ãªãã
// å®éã®ã·ã¹ãã ã§ã¯ãããã§ããªãŒãªã¹ããããå
ç¢ã«ç®¡çããã
// ç°¡åã®ãããåè
ã®ããŒãã䜿çšããã
nextNodeIndex = actualOldValue;
}
}
currentNodeIndex = nextNodeIndex;
}
// æåŸã®ããŒããçµç«¯ãšããŠããŒã¯
Atomics.store(sharedBuffer, currentNodeIndex + IS_TERMINAL_OFFSET, 1);
}
ã¹ã¬ããã»ãŒããªæ€çŽ¢ã®å®è£ ïŒ`search`ããã³`startsWith`æäœïŒ
åèªã®æ€çŽ¢ãç¹å®ã®ãã¬ãã£ãã¯ã¹ãæã€ãã¹ãŠã®åèªãèŠã€ãããããªèªã¿åãæäœã¯ãæ§é ã倿Žããªããããäžè¬çã«åçŽã§ããããããäžŠè¡æžã蟌ã¿ããã®éšåçãªèªã¿åããé¿ãããããäžè²«æ§ã®ããææ°ã®å€ãèªã¿åãããã«ãäŸç¶ãšããŠã¢ãããã¯ãªèªã¿èŸŒã¿ã䜿çšããå¿ èŠããããŸãã
ã¹ã¬ããã»ãŒããªæ€çŽ¢ã®æŠå¿µçãªæé ïŒ
- ã«ãŒãããéå§ïŒ ã«ãŒãããŒãããå§ããŸãã
-
æåããšã«ãã©ããŒã¹ïŒ æ€çŽ¢ãã¬ãã£ãã¯ã¹ã®åæåã«ã€ããŠïŒ
- åã€ã³ããã¯ã¹ã®æ±ºå®ïŒ æåã®åãã€ã³ã¿ãªãã»ãããèšç®ããŸãã
- åãã€ã³ã¿ã®ã¢ãããã¯ãªèªã¿èŸŒã¿ïŒ `Atomics.load(typedArray, current_node_child_pointer_index)`ã䜿çšããŸãã
- åã®ååšç¢ºèªïŒ èªã¿èŸŒãŸãããã€ã³ã¿ã0ã®å Žåãåèª/ãã¬ãã£ãã¯ã¹ã¯ååšããŸãããçµäºããŸãã
- åãžç§»åïŒ ååšããå Žåã`current_node`ãèªã¿èŸŒãŸããåã€ã³ããã¯ã¹ã«æŽæ°ããç¶è¡ããŸãã
- æçµãã§ãã¯ïŒ`search`ã®å ŽåïŒïŒ åèªå šäœããã©ããŒã¹ããåŸãæåŸã®ããŒãã®`isTerminal`ãã©ã°ãã¢ãããã¯ã«èªã¿èŸŒã¿ãŸããããã1ã§ããã°åèªã¯ååšããããã§ãªããã°åãªããã¬ãã£ãã¯ã¹ã§ãã
- `startsWith`ã®å ŽåïŒ å°éããæåŸã®ããŒãããã¬ãã£ãã¯ã¹ã®çµããã衚ããŸãããã®ããŒããããæ·±ãåªå æ¢çŽ¢ïŒDFSïŒãŸãã¯å¹ åªå æ¢çŽ¢ïŒBFSïŒãéå§ããŠïŒã¢ãããã¯ãªèªã¿èŸŒã¿ã䜿çšïŒããã®ãµãããªãŒå ã®ãã¹ãŠã®çµç«¯ããŒããèŠã€ããããšãã§ããŸãã
èªã¿åãæäœã¯ãåºç€ãšãªãã¡ã¢ãªã«ã¢ãããã¯ã«ã¢ã¯ã»ã¹ããéããæ¬è³ªçã«å®å šã§ããæžã蟌ã¿äžã®`compareExchange`ããžãã¯ã«ãããç¡å¹ãªãã€ã³ã¿ã確ç«ãããããšã¯ãªããæžã蟌ã¿äžã®ç«¶åã¯äžè²«æ§ã®ããç¶æ ïŒããã¯ãŒã«ãŒã«ãšã£ãŠã¯ãããã«é å»¶ããå¯èœæ§ããããŸããïŒã«ã€ãªãããŸãã
æ€çŽ¢ã®ããã®èª¬æçãªïŒç°¡ç¥åãããïŒæ¬äŒŒã³ãŒãïŒ
function searchWord(word, sharedBuffer) {
let currentNodeIndex = NODE_SIZE;
for (let i = 0; i < word.length; i++) {
const charCode = word.charCodeAt(i);
const childIndexInNode = charCode - 'a'.charCodeAt(0) + CHILDREN_OFFSET;
const childPointerOffset = currentNodeIndex + childIndexInNode;
const nextNodeIndex = Atomics.load(sharedBuffer, childPointerOffset);
if (nextNodeIndex === 0) {
return false; // æåã®ãã¹ãååšããªã
}
currentNodeIndex = nextNodeIndex;
}
// æåŸã®ããŒããçµç«¯åèªãã©ããããã§ãã¯
return Atomics.load(sharedBuffer, currentNodeIndex + IS_TERMINAL_OFFSET) === 1;
}
ã¹ã¬ããã»ãŒããªåé€ã®å®è£ ïŒäžçŽïŒ
åé€ã¯ã䞊è¡å ±æã¡ã¢ãªç°å¢ã§ã¯èããå°é£ã§ããåçŽãªåé€ã¯ã次ã®ãããªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
- ãã³ã°ãªã³ã°ãã€ã³ã¿ïŒ ããã¯ãŒã«ãŒãããŒããåé€ããŠããéã«å¥ã®ã¯ãŒã«ãŒãããããã©ããŒã¹ããŠãããšããã©ããŒã¹äžã®ã¯ãŒã«ãŒãç¡å¹ãªãã€ã³ã¿ããã©ãå¯èœæ§ããããŸãã
- äžæŽåãªç¶æ ïŒ éšåçãªåé€ã¯ããã©ã€æšã䜿çšäžå¯èœãªç¶æ ã®ãŸãŸã«ããå¯èœæ§ããããŸãã
- ã¡ã¢ãªã®æçåïŒ åé€ãããã¡ã¢ãªãå®å šãã€å¹ççã«ååããããšã¯è€éã§ãã
å®å šã«åé€ãåŠçããããã®äžè¬çãªæŠç¥ã«ã¯ã以äžã®ãããªãã®ããããŸãã
- è«çåé€ïŒããŒãã³ã°ïŒïŒ ããŒããç©ççã«åé€ãã代ããã«ã`isDeleted`ãã©ã°ãã¢ãããã¯ã«èšå®ããŸããããã«ãã䞊è¡åŠçã¯ç°¡çŽ åãããŸãããããå€ãã®ã¡ã¢ãªã䜿çšããŸãã
- åç §ã«ãŠã³ãã£ã³ã° / ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ åããŒããã¢ãããã¯ãªåç §ã«ãŠã³ããç¶æããŸããããŒãã®åç §ã«ãŠã³ãããŒãã«ãªããšãããã¯æ¬åœã«åé€å¯Ÿè±¡ãšãªãããã®ã¡ã¢ãªã¯ååã§ããŸãïŒäŸïŒããªãŒãªã¹ãã«è¿œå ïŒããããåç §ã«ãŠã³ãã®ã¢ãããã¯ãªæŽæ°ãå¿ èŠã§ãã
- Read-Copy-Update (RCU)ïŒ èªã¿åããå€ãæžã蟌ã¿ãå°ãªãã·ããªãªã§ã¯ãæžã蟌ã¿åŽããã©ã€æšã®å€æŽãããéšåã®æ°ããããŒãžã§ã³ãäœæããå®äºãããæ°ããããŒãžã§ã³ãžã®ãã€ã³ã¿ãã¢ãããã¯ã«ã¹ã¯ããããŸããèªã¿åãåŽã¯ã¹ã¯ãããå®äºãããŸã§å€ãããŒãžã§ã³ã§ç¶ç¶ããŸããããã¯ãã©ã€æšã®ãããªè©³çްãªããŒã¿æ§é ã«ã¯å®è£ ãè€éã§ããã匷åãªäžè²«æ§ä¿èšŒãæäŸããŸãã
å€ãã®å®çšçãªã¢ããªã±ãŒã·ã§ã³ãç¹ã«é«ã¹ã«ãŒããããå¿ èŠãšãããã®ã§ã¯ããã©ã€æšã远å å°çšã«ããããè«çåé€ã䜿çšããè€éãªã¡ã¢ãªååãéèŠåºŠã®äœãæé垯ã«å»¶æããããå€éšã§ç®¡çããã®ãäžè¬çãªã¢ãããŒãã§ããçã«å¹ççã§ã¢ãããã¯ãªç©ççåé€ã®å®è£ ã¯ã䞊è¡ããŒã¿æ§é ã«ãããç ç©¶ã¬ãã«ã®åé¡ã§ãã
å®çšäžã®èæ ®äºé ãšããã©ãŒãã³ã¹
䞊è¡ãã©ã€æšã®æ§ç¯ã¯ãæ£ããã ãã§ãªããå®çšçãªããã©ãŒãã³ã¹ãšä¿å®æ§ãéèŠã§ãã
ã¡ã¢ãªç®¡çãšãªãŒããŒããã
-
`SharedArrayBuffer`ã®åæåïŒ ãããã¡ã¯ååãªãµã€ãºã«äºåã«å²ãåœãŠãããå¿
èŠããããŸããããŒãã®æå€§æ°ãšãã®åºå®ãµã€ãºãèŠç©ããããšãéèŠã§ãã
SharedArrayBufferã®åçãªãµã€ãºå€æŽã¯ç°¡åã§ã¯ãªããå€ãã®å Žåãæ°ãããã倧ããªãããã¡ãäœæããŠå 容ãã³ããŒããå¿ èŠããããããã¯ç¶ç¶çãªæäœã®ããã®å ±æã¡ã¢ãªã®ç®çãæãªããŸãã - ã¹ããŒã¹å¹çïŒ åºå®ãµã€ãºã®ããŒãã¯ãã¡ã¢ãªå²ãåœãŠãšãã€ã³ã¿æŒç®ãç°¡çŽ åããäžæ¹ã§ãå€ãã®åã»ãããçãªããŒããå€ãå Žåãã¡ã¢ãªå¹çãäœäžããå¯èœæ§ããããŸããããã¯ãç°¡çŽ åããã䞊è¡ç®¡çã®ããã®ãã¬ãŒããªãã§ãã
-
æåã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ
SharedArrayBufferå ã«ã¯èªåã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯ãããŸãããåé€ãããããŒãã®ã¡ã¢ãªã¯ãã¡ã¢ãªãªãŒã¯ãæçåãé¿ããããã«ããã°ãã°ããªãŒãªã¹ããéããŠæç€ºçã«ç®¡çããå¿ èŠããããŸããããã«ãããããªãã®è€éããå ãããŸãã
ããã©ãŒãã³ã¹ãã³ãããŒã¯
ãã€äžŠè¡ãã©ã€æšãéžæãã¹ãã§ããããïŒããã¯ãã¹ãŠã®ç¶æ³ã«å¯Ÿããäžèœè¬ã§ã¯ãããŸããã
- ã·ã³ã°ã«ã¹ã¬ãã vs. ãã«ãã¹ã¬ããïŒ å°ããªããŒã¿ã»ãããäœãäžŠè¡æ§ã®å ŽåãWeb Workeréä¿¡ã®ã»ããã¢ãããã¢ãããã¯æäœã®ãªãŒããŒãããã®ãããã¡ã€ã³ã¹ã¬ããäžã®æšæºçãªãªããžã§ã¯ãããŒã¹ã®ãã©ã€æšã®æ¹ããŸã éããããããŸããã
- é«ãäžŠè¡æžã蟌ã¿/èªã¿åãæäœïŒ 䞊è¡ãã©ã€æšã¯ãå€§èŠæš¡ãªããŒã¿ã»ããã倧éã®äžŠè¡æžãèŸŒã¿æäœïŒæ¿å ¥ãåé€ïŒãããã³å€ãã®äžŠè¡èªã¿åãæäœïŒæ€çŽ¢ããã¬ãã£ãã¯ã¹ã«ãã¯ã¢ããïŒãããå Žåã«ç䟡ãçºæ®ããŸããããã«ãããã¡ã€ã³ã¹ã¬ããããéãèšç®ããªãããŒããããŸãã
- `Atomics`ã®ãªãŒããŒãããïŒ ã¢ãããã¯æäœã¯ãæ£ããã®ããã«ã¯äžå¯æ¬ ã§ãããäžè¬çã«éã¢ãããã¯ãªã¡ã¢ãªã¢ã¯ã»ã¹ãããäœéã§ããå©ç¹ã¯ãåã ã®æäœã®é«éåããã§ã¯ãªããè€æ°ã®ã³ã¢ã§ã®äžŠåå®è¡ããåŸãããŸãã䞊ååŠçã«ããé床åäžãã¢ãããã¯æäœã®ãªãŒããŒããããäžåããã©ããã倿ããããã«ã¯ãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã§ã®ãã³ãããŒã¯ãäžå¯æ¬ ã§ãã
ãšã©ãŒåŠçãšå ç¢æ§
䞊è¡ããã°ã©ã ã®ãããã°ã¯éåžžã«å°é£ã§ããç«¶åç¶æ ã¯æãã«ãããéæ±ºå®çã§ããå€ãã®äžŠè¡ã¯ãŒã«ãŒã«ããã¹ãã¬ã¹ãã¹ããå«ããå æ¬çãªãã¹ããäžå¯æ¬ ã§ãã
- ãªãã©ã€ïŒ `compareExchange`ã®ãããªæäœã倱æããããšã¯ãå¥ã®ã¯ãŒã«ãŒãå ã«åŠçãçµããããšãæå³ããŸããæ¿å ¥ã®æ¬äŒŒã³ãŒãã§ç€ºãããŠããããã«ãããžãã¯ã¯ãªãã©ã€ãŸãã¯é©å¿ããæºåãã§ããŠããå¿ èŠããããŸãã
- ã¿ã€ã ã¢ãŠãïŒ ããè€éãªåæã§ã¯ã`Atomics.wait`ã¯`notify`ãå±ããªãå Žåã«ãããããã¯ãé²ãããã«ã¿ã€ã ã¢ãŠããèšå®ã§ããŸãã
ãã©ãŠã¶ãšç°å¢ã®ãµããŒã
- Web WorkersïŒ ææ°ã®ãã©ãŠã¶ãšNode.jsïŒ`worker_threads`ïŒã§åºããµããŒããããŠããŸãã
-
`SharedArrayBuffer` & `Atomics`ïŒ ãã¹ãŠã®äž»èŠãªææ°ãã©ãŠã¶ãšNode.jsã§ãµããŒããããŠããŸãããã ããåè¿°ã®éãããã©ãŠã¶ç°å¢ã§ã¯ã»ãã¥ãªãã£äžã®æžå¿µãã`SharedArrayBuffer`ãæå¹ã«ããããã«ç¹å®ã®HTTPããããŒïŒCOOP/COEPïŒãå¿
èŠã§ããããã¯ãã°ããŒãã«ãªå±éãç®æãWebã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéèŠãªãããã€ã¡ã³ãã®è©³çްã§ãã
- ã°ããŒãã«ãªåœ±é¿ïŒ äžçäžã®ãµãŒããŒã€ã³ãã©ããããã®ããããŒãæ£ããéä¿¡ããããã«èšå®ãããŠããããšã確èªããŠãã ããã
ãŠãŒã¹ã±ãŒã¹ãšã°ããŒãã«ãªåœ±é¿
JavaScriptã§ã¹ã¬ããã»ãŒããªäžŠè¡ããŒã¿æ§é ãæ§ç¯ããèœåã¯ãç¹ã«ã°ããŒãã«ãªãŠãŒã¶ãŒããŒã¹ã«ãµãŒãã¹ãæäŸããããèšå€§ãªéã®åæ£ããŒã¿ãåŠçãããããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠãå¯èœæ§ã®äžçãåºããŸãã
- ã°ããŒãã«ãªæ€çŽ¢ïŒãªãŒãã³ã³ããªãŒããã©ãããã©ãŒã ïŒ åœéçãªæ€çŽ¢ãšã³ãžã³ãEã³ããŒã¹ãã©ãããã©ãŒã ãã倿§ãªèšèªãæåã»ããã«ããã補ååãå ŽæããŠãŒã¶ãŒã®ã¯ãšãªã«å¯ŸããŠãè¶ é«éã§ãªã¢ã«ã¿ã€ã ã®ãªãŒãã³ã³ããªãŒãåè£ãæäŸããå¿ èŠããããšæ³åããŠã¿ãŠãã ãããWeb Workerså ã®äžŠè¡ãã©ã€æšã¯ãã¡ã€ã³UIã¹ã¬ãããé å»¶ãããããšãªãã倧éã®åæã¯ãšãªãšåçãªæŽæ°ïŒäŸïŒæ°è£œåããã¬ã³ãæ€çŽ¢ïŒãåŠçã§ããŸãã
- 忣ãœãŒã¹ããã®ãªã¢ã«ã¿ã€ã ããŒã¿åŠçïŒ ç°ãªã倧éžã®ã»ã³ãµãŒããããŒã¿ãåéããIoTã¢ããªã±ãŒã·ã§ã³ããæ§ã ãªååŒæããã®åžå ŽããŒã¿ãã£ãŒããåŠçããéèã·ã¹ãã ã®å Žåã䞊è¡ãã©ã€æšã¯æååããŒã¹ã®ããŒã¿ã¹ããªãŒã ïŒäŸïŒããã€ã¹IDãæ ªåŒãã£ãã«ãŒïŒãå¹ççã«ã€ã³ããã¯ã¹åããã¯ãšãªãå®è¡ã§ããŸããããã«ãããè€æ°ã®åŠçãã€ãã©ã€ã³ãå ±æããŒã¿äžã§äžŠè¡ããŠåäœããããšãå¯èœã«ãªããŸãã
- å ±åç·šéïŒIDEïŒ ãªã³ã©ã€ã³ã®å ±åããã¥ã¡ã³ããšãã£ã¿ãã¯ã©ãŠãããŒã¹ã®IDEã§ã¯ãå ±æãã©ã€æšããªã¢ã«ã¿ã€ã ã®æ§æãã§ãã¯ãã³ãŒãè£å®ããŸãã¯ã¹ãã«ãã§ãã¯ã匷åã§ããŸããããã¯ãç°ãªãã¿ã€ã ãŸãŒã³ã®è€æ°ã®ãŠãŒã¶ãŒã倿Žãå ãããã³ã«å³åº§ã«æŽæ°ãããŸããå ±æãã©ã€æšã¯ããã¹ãŠã®ã¢ã¯ãã£ããªç·šéã»ãã·ã§ã³ã«äžè²«ãããã¥ãŒãæäŸããŸãã
- ã²ãŒã ïŒã·ãã¥ã¬ãŒã·ã§ã³ïŒ ãã©ãŠã¶ããŒã¹ã®ãã«ããã¬ã€ã€ãŒã²ãŒã ã§ã¯ã䞊è¡ãã©ã€æšãã²ãŒã å ã®èŸæžæ€çŽ¢ïŒåèªã²ãŒã çšïŒããã¬ã€ã€ãŒåã€ã³ããã¯ã¹ãããã«ã¯å ±æã¯ãŒã«ãã¹ããŒãå ã®AIã®çµè·¯æ¢çŽ¢ããŒã¿ã管çãããã¹ãŠã®ã²ãŒã ã¹ã¬ãããå¿çæ§ã®é«ãã²ãŒã ãã¬ã€ã®ããã«äžè²«ããæ å ±ã§åäœããããšãä¿èšŒã§ããŸãã
- 髿§èœãããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ïŒ å€ãã®å Žåãå°çšããŒããŠã§ã¢ãäœã¬ãã«èšèªã§åŠçãããŸãããJavaScriptããŒã¹ã®ãµãŒããŒïŒNode.jsïŒã¯ãç¹ã«æè»æ§ãšè¿ éãªãããã€ã¡ã³ããåªå ãããç°å¢ã§ãåçãªã«ãŒãã£ã³ã°ããŒãã«ããããã³ã«è§£æãå¹ççã«ç®¡çããããã«äžŠè¡ãã©ã€æšã掻çšã§ããŸãã
ãããã®äŸã¯ãèšç®éçŽçãªæååæäœãããã¯ã°ã©ãŠã³ãã¹ã¬ããã«ãªãããŒããã䞊è¡ãã©ã€æšãéããŠããŒã¿ã®æŽåæ§ãç¶æããããšããã°ããŒãã«ãªèŠæ±ã«çŽé¢ããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãšã¹ã±ãŒã©ããªãã£ãåçã«åäžãããæ¹æ³ãæµ®ã圫ãã«ããŠããŸãã
JavaScriptã«ããã䞊è¡åŠçã®æªæ¥
JavaScriptã®äžŠè¡åŠçã®ç¶æ³ã¯ç¶ç¶çã«é²åããŠããŸãã
- WebAssemblyãšå ±æã¡ã¢ãªïŒ WebAssemblyã¢ãžã¥ãŒã«ã`SharedArrayBuffer`äžã§åäœã§ããCPUããŠã³ããªã¿ã¹ã¯ã«å¯ŸããŠããã«ãã现ããå¶åŸ¡ãšæœåšçã«ããé«ãããã©ãŒãã³ã¹ãæäŸãã€ã€ãJavaScriptã®Web Workersãšçžäºäœçšããããšãã§ããŸãã
- JavaScriptããªããã£ãã®ãããªã鲿©ïŒ ECMAScriptæšæºã¯ã䞊è¡åŠçããªããã£ãã®æ¢æ±ãšæ¹è¯ãç¶ããŠãããäžè¬çãªäžŠè¡ãã¿ãŒã³ãç°¡çŽ åããããé«ã¬ãã«ã®æœè±¡åãæäŸããå¯èœæ§ããããŸãã
- ã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ïŒ ãããã®äœã¬ãã«ããªããã£ããæçããã«ã€ããŠã`SharedArrayBuffer`ãš`Atomics`ã®è€éããæœè±¡åããã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãç»å Žããéçºè ãã¡ã¢ãªç®¡çã«é¢ããæ·±ãç¥èãªãã«äžŠè¡ããŒã¿æ§é ãæ§ç¯ãããããªãããšãæåŸ ãããŸãã
ãããã®é²æ©ãåãå ¥ããããšã§ãJavaScriptéçºè ã¯å¯èœæ§ã®éçãæŒãåºããã°ããŒãã«ã«æ¥ç¶ãããäžçã®èŠæ±ã«å¿ããããšãã§ããã髿§èœã§å¿çæ§ã®é«ãWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
çµè«
åºæ¬çãªãã©ã€æšããå®å
šã«ã¹ã¬ããã»ãŒããªäžŠè¡ãã©ã€æšãžã®éã®ãã¯ãJavaScriptã®é©ãã¹ãé²åãšããããä»éçºè
ã«æäŸããåã®èšŒã§ããSharedArrayBufferãšAtomicsãæŽ»çšããããšã§ãã·ã³ã°ã«ã¹ã¬ããã¢ãã«ã®éçãè¶
ããè€éãªåææäœãæŽåæ§ãšé«ãããã©ãŒãã³ã¹ã§åŠçã§ããããŒã¿æ§é ãäœãäžããããšãã§ããŸãã
ãã®ã¢ãããŒãã«ã¯èª²é¡ããªãããã§ã¯ãããŸãããã¡ã¢ãªã¬ã€ã¢ãŠããã¢ãããã¯æäœã®é åºãå ç¢ãªãšã©ãŒåŠçã«ã€ããŠæ éãªæ€èšãæ±ããããŸããããããå€§èŠæš¡ã§å¯å€ãªæååããŒã¿ã»ãããæ±ããã°ããŒãã«èŠæš¡ã®å¿çæ§ãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠã䞊è¡ãã©ã€æšã¯åŒ·åãªãœãªã¥ãŒã·ã§ã³ãæäŸããŸããããã«ãããéçºè ã¯æ¬¡äžä»£ã®ã¹ã±ãŒã©ãã«ã§ã€ã³ã¿ã©ã¯ãã£ãããã€å¹ççãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããåºç€ãšãªãããŒã¿åŠçãã©ãã»ã©è€éã«ãªã£ãŠãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãã·ãŒã ã¬ã¹ã§ããç¶ããããšãä¿èšŒã§ããŸããJavaScriptã®äžŠè¡åŠçã®æªæ¥ã¯ããã«ããã䞊è¡ãã©ã€æšã®ãããªæ§é ã«ãã£ãŠããããŸã§ä»¥äžã«ãšããµã€ãã£ã³ã°ã§æèœãªãã®ã«ãªã£ãŠããŸãã